/*
 * @lc app=leetcode.cn id=145 lang=cpp
 *
 * [145] 二叉树的后序遍历
 *
 * https://leetcode-cn.com/problems/binary-tree-postorder-traversal/description/
 *
 * algorithms
 * Easy (75.54%)
 * Likes:    802
 * Dislikes: 0
 * Total Accepted:    409.1K
 * Total Submissions: 540.9K
 * Testcase Example:  '[1,null,2,3]'
 *
 * 给你一棵二叉树的根节点 root ，返回其节点值的 后序遍历 。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：root = [1,null,2,3]
 * 输出：[3,2,1]
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入：root = []
 * 输出：[]
 * 
 * 
 * 示例 3：
 * 
 * 
 * 输入：root = [1]
 * 输出：[1]
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 树中节点的数目在范围 [0, 100] 内
 * -100 <= Node.val <= 100
 * 
 * 
 * 
 * 
 * 进阶：递归算法很简单，你可以通过迭代算法完成吗？
 * 
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    //递归遍历
    // void traversal(TreeNode* cur, vector<int>& vec){
    //     if(cur == NULL) return;
    //     traversal(cur->left, vec);
    //     traversal(cur->right, vec);
    //     vec.push_back(cur->val);
    // }
    // vector<int> postorderTraversal(TreeNode* root) {
    //     vector<int> result;
    //     traversal(root, result);
    //     return result;
    // }

    // //迭代遍历
    // vector<int> postorderTraversal(TreeNode* root) {
    //     stack<TreeNode*> st;
    //     vector<int> res;

    //     if(root == NULL) return res;

    //     st.push(root);

    //     while(!st.empty()){
    //         TreeNode* node = st.top();
    //         st.pop();

    //         res.push_back(node->val);

    //         if(node->left) st.push(node->left);
    //         if(node->right) st.push(node->right);
    //     }

    //     reverse(res.begin(), res.end());

    //     return res;
    // }

    // //递归遍历
    // void traversal(TreeNode* cur, vector<int>& vec){
    //     if(cur == NULL) return;

    //     if(cur->left) traversal(cur->left, vec);
    //     if(cur->right) traversal(cur->right, vec);
    //     vec.push_back(cur->val);
    // } 
    // vector<int> postorderTraversal(TreeNode* root) {
    //     vector<int> res;
    //     TreeNode* cur = root;
    //     if(cur == NULL) return res;
    //     traversal(cur, res);
    //     return res;
    // }

    //迭代遍历
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> res;
        TreeNode* cur = root;
        if(cur == NULL) return res;
        st.push(cur);

        while(!st.empty()){
            cur = st.top();
            st.pop();

            res.push_back(cur->val);
            if(cur->left) st.push(cur->left);
            if(cur->right) st.push(cur->right); // 按照中右左放进vector
        }

        reverse(res.begin(), res.end());
        return res;
    }


    // //用一个栈来表示，统一迭代法
    // vector<int> postorderTraversal(TreeNode* root) {
    //     stack<TreeNode*> st;
    //     vector<int> res;
    //     TreeNode* cur = root;
    //     if(cur == NULL) return res;

    //     st.push(cur);

    //     while(!st.empty()){
    //         TreeNode* node = st.top();
    //         if(node != NULL){
    //             st.push(NULL);

    //             if(node->right) st.push(node->right);
    //             if(node->left) st.push(node->left);
    //         } else {
    //             st.pop();
    //             cur = st.top();
    //             st.pop();
    //             res.push_back(cur->val);
    //         }
    //     }
    //     return res;
    // }




};
// @lc code=end

